%% 连接圆控制刺激1(总面积相等)，添加颜色通道和对比度增强的背景色，按颜色保存到不同文件夹
% areaSum=1200;
% radistmp > 6*circle_radius;（6*r是不粘在一起的距离，与standard一致）
% number_sets = 1:15
% 增加50种颜色通道，每类20张图片，背景为色系相似但差值>100的颜色

clear; sca
[xax, yax] = meshgrid(1:224, 1:224);
rax = xax+1i*yax;

%% 设置总面积
areaSum = 1200; % 总面积=1200

%% 设置图片数和颜色数
number_sets = 1:15; % 要生成15类数量
image_iter = 20; % 每类数量要生成20张图
color_num = 50; % 颜色种类数量

% 生成50种随机颜色
colors = rand(color_num, 3); % 每行是一种RGB颜色
% 提高颜色值，确保清晰可见
colors = colors * 0.8 + 0.2; % 确保颜色值在0.2到1.0之间

% 创建主输出文件夹
main_output_dir = 'connected_control1_images';
if ~exist(main_output_dir, 'dir')
    mkdir(main_output_dir);
end

% 所有数量保存在image_control1的变量中 (size=224*224*20*15*3*50) - 增加了RGB三通道和颜色维度
connected_image_control1 = zeros(size(rax, 1), size(rax, 2), 3, image_iter, length(number_sets), color_num); 

% 查找可用的屏幕
screens = Screen('Screens');
screenNumber = max(screens); % 使用主屏幕

for cc = 1:color_num % 对每种颜色循环
    current_color = colors(cc, :); % 当前颜色
    
    % 使用HSV色彩空间计算背景颜色 - 保持色相，降低饱和度，增加明度
    hsv_color = rgb2hsv(current_color);  % 转换到HSV颜色空间
    hsv_color(2) = hsv_color(2) * 0.4;   % 降低饱和度到原来的40%
    hsv_color(3) = min(1, hsv_color(3) * 1.8);  % 增加明度，但不超过1
    bg_color = hsv2rgb(hsv_color);  % 转回RGB颜色空间
    
    % 检查颜色差值，确保差值>100 (0-255范围内)
    stim_color_255 = round(current_color * 255);
    bg_color_255 = round(bg_color * 255);
    
    % 计算欧氏距离作为颜色差异度量
    color_diff = sqrt(sum((stim_color_255 - bg_color_255).^2));
    
    % 如果差值不够大，继续调整背景色
    adjustment_attempts = 0;
    while color_diff < 100 && adjustment_attempts < 10
        % 进一步调整HSV值以增加对比度
        if hsv_color(3) < 0.9  % 如果明度还有提升空间
            hsv_color(3) = min(1, hsv_color(3) + 0.1);  % 继续增加明度
        else  % 如果明度已经很高，则降低饱和度
            hsv_color(2) = max(0, hsv_color(2) - 0.1);
        end
        
        bg_color = hsv2rgb(hsv_color);  % 更新背景颜色
        bg_color_255 = round(bg_color * 255);
        color_diff = sqrt(sum((stim_color_255 - bg_color_255).^2));
        adjustment_attempts = adjustment_attempts + 1;
    end
    
    % 如果还是无法满足差值要求，使用一个默认的高对比度背景
    if color_diff < 100
        % 检查颜色亮度
        luminance = 0.2126 * current_color(1) + 0.7152 * current_color(2) + 0.0722 * current_color(3);
        if luminance > 0.5
            bg_color = [0.1, 0.1, 0.1];  % 暗色刺激用深色背景
        else
            bg_color = [0.9, 0.9, 0.9];  % 亮色刺激用浅色背景
        end
        bg_color_255 = round(bg_color * 255);
        color_diff = sqrt(sum((stim_color_255 - bg_color_255).^2));
    end
    
    % 创建当前颜色的文件夹 (使用颜色值作为文件夹名)
    color_folder_name = sprintf('color_%d_%.3f_%.3f_%.3f_diff%.0f', cc, current_color(1), current_color(2), current_color(3), color_diff);
    color_folder_path = fullfile(main_output_dir, color_folder_name);
    if ~exist(color_folder_path, 'dir')
        mkdir(color_folder_path);
    end
    
    for tt = 1:length(number_sets) % 类数量的总数
        nn = number_sets(tt); % 当前类需要生成的连接圆个数

        for ii = 1:image_iter % 每类数生成20张图
            % 控制面积 - control1的核心逻辑：通过公式计算半径，使总面积保持一致
            syms circle_radius positive; % 通过方程使每张图总面积=1200，算出半径
            circle_radius = solve((pi*circle_radius^2)*nn*2+nn*2*circle_radius == areaSum, circle_radius);
            circle_radius = double(circle_radius);
            
            % 直接使用图像处理方式生成图像
            % 创建背景图像 - 使用色系相同但对比度增强的颜色
            img = ones(224, 224, 3);
            for ch = 1:3
                img(:,:,ch) = bg_color(ch);
            end
            
            % 第一个连接圆
            loc1 = 5*(ceil(circle_radius))+randi(size(rax,2)-10*ceil(circle_radius))...
                  +1i*((5*ceil(circle_radius))+randi(size(rax,1)-10*ceil(circle_radius)));
            
            x1 = real(loc1); % 圆心1的x坐标
            y1 = imag(loc1); % 圆心1的y坐标
            [x2,y2,locm,circle] = creatanconnectedCircle(circle_radius,x1,y1);

            %% 保存参数
            locmtmp = locm; % 连接圆中点位置
            x1tmp = x1; % 圆心1的x坐标
            y1tmp = y1; % 圆心1的y坐标
            x2tmp = x2; % 圆心2的x坐标
            y2tmp = y2; % 圆心2的y坐标
            circletmp = circle; % 圆心坐标

            while length(locmtmp)<nn  % 要生成nn个连接圆刺激           
                % 第nn个连接圆
                loc1 = 5*(ceil(circle_radius))+randi(size(rax,2)-10*ceil(circle_radius))...
                      +1i*((5*ceil(circle_radius))+randi(size(rax,1)-10*ceil(circle_radius)));

                x1 = real(loc1); % 圆心1的横坐标
                y1 = imag(loc1); % 圆心1的纵坐标
                [x2,y2,locm,circle] = creatanconnectedCircle(circle_radius,x1,y1);

                % 控制连接圆不重叠（连接圆中心之间的距离>6*r）- 改为与standard一致
                distancestmp = abs(locm-locmtmp); % 当前连接圆的中点与其他连接圆的中点距离
                radistmp = (6*circle_radius); % 改为与standard一致：6*r
                okToAdd = all(distancestmp>radistmp); % 每个连接圆不能小于6*r，否则就有可能重叠
               
                if okToAdd
                    % 保存参数
                    locmtmp = [locmtmp,locm]; % 中点位置
                    x1tmp = [x1tmp,x1];% 所有圆1的x坐标
                    y1tmp = [y1tmp,y1];% 所有圆1的y坐标
                    x2tmp = [x2tmp,x2];% 所有圆2的x坐标
                    y2tmp = [y2tmp,y2];% 所有圆2的y坐标
                    circletmp = [circletmp,circle];
                end
            end

            % 使用图像处理方式绘制刺激
            % 绘制连接线
            for ll = 1:nn
                img = drawLine(img, round(x1tmp(ll)), round(y1tmp(ll)), round(x2tmp(ll)), round(y2tmp(ll)), current_color);
            end
            
            % 绘制圆点
            for cc_idx = 1:size(circletmp,2)
                img = drawCircle(img, round(circletmp(1,cc_idx)), round(circletmp(2,cc_idx)), circle_radius, current_color);
            end
            
            % 保存图像到数组
            connected_image_control1(:,:,:,ii,tt,cc) = img;
            
            % 保存图片到对应颜色的文件夹
            img_filename = sprintf('circle_nn%d_img%d.png', nn, ii);
            img_path = fullfile(color_folder_path, img_filename);
            imwrite(img, img_path);
            
            % 显示第一张图像以确认生成正确
            if cc == 1 && tt == 1 && ii == 1
                figure;
                imshow(img);
                title(sprintf('示例图像 - 颜色差值: %.0f', color_diff));
                drawnow;
            end
        end
    end
end

% 保存变量
connected_vgg_control1_color = connected_image_control1;
save connected_vgg_control1_color.mat connected_vgg_control1_color -v7.3 % 使用-v7.3格式保存大矩阵

% 自定义画线函数
function img = drawLine(img, x1, y1, x2, y2, color)
    % 使用Bresenham算法绘制线段
    dx = abs(x2 - x1);
    dy = abs(y2 - y1);
    steep = dy > dx;
    
    if steep
        [x1, y1] = deal(y1, x1);
        [x2, y2] = deal(y2, x2);
    end
    
    if x1 > x2
        [x1, x2] = deal(x2, x1);
        [y1, y2] = deal(y2, y1);
    end
    
    dx = x2 - x1;
    dy = abs(y2 - y1);
    err = dx / 2;
    
    if y1 < y2
        ystep = 1;
    else
        ystep = -1;
    end
    
    for x = x1:x2
        if steep
            if y1 >= 1 && y1 <= size(img, 2) && x >= 1 && x <= size(img, 1)
                img(x, y1, 1) = color(1);
                img(x, y1, 2) = color(2);
                img(x, y1, 3) = color(3);
            end
        else
            if x >= 1 && x <= size(img, 2) && y1 >= 1 && y1 <= size(img, 1)
                img(y1, x, 1) = color(1);
                img(y1, x, 2) = color(2);
                img(y1, x, 3) = color(3);
            end
        end
        
        err = err - dy;
        if err < 0
            y1 = y1 + ystep;
            err = err + dx;
        end
    end
end

% 自定义画圆函数
function img = drawCircle(img, cx, cy, r, color)
    % 使用中点圆算法绘制实心圆
    [X, Y] = meshgrid(1:size(img, 2), 1:size(img, 1));
    mask = (X - cx).^2 + (Y - cy).^2 <= r^2;
    
    % 对每个颜色通道应用掩码
    for c = 1:3
        channel = img(:, :, c);
        channel(mask) = color(c);
        img(:, :, c) = channel;
    end
end